#include "parser.cpp"
#include "../Clustering/Kmeans.cpp"
#include "../Clustering/Operador.cpp"


/*
 * aca se realizan todas las pruebas relacionadas con el parser
 */
using namespace std;

void primeraPrueba(){
	string unaPalabra = "PaLaBrA";
	Parser unParser;
	unParser = Parser();
	int *terminosLinea = new int();
	int *terminosDoc = new int();

	cout<<"***------PRIMERA PRUEBA----------***"<<endl;
	cout<<"Palabra sin pasar a minuscula: ";
	cout<<unaPalabra<<endl;

	/*pasamos todos los terminos a minuscula*/
	unaPalabra = unParser.aMinuscula(unaPalabra);

	cout<<"Palabra en minuscula: ";
	cout<<unaPalabra<<endl;
	cout<<endl;

	return;
}

void segundaPrueba(){
	string unaPalabra = "PaLaBrA";
	Parser unParser;
	unParser = Parser();
	int *terminosLinea = new int();
	int *terminosDoc = new int();

	string unaLinea = "FOR the most wild, yet most homely narrative which I am about to pen, I neither expect nor solicit belief. Mad indeed would I be to expect it,";
	string* arrayPalabras;

	arrayPalabras = unParser.parsearLinea(unaLinea,1000, terminosLinea);

	cout<<"***------SEGUNDA PRUEBA----------***"<<endl;
	cout<<"Linea: "<<unaLinea<<endl;
	cout<<"Parseamos una linea de texto:"<<endl;
	cout<<endl;
	cout<<"cantidad de Terminos parseados: "<<*terminosLinea<<endl;

	cout<<endl;
	cout<<endl;

	return;
}

void terceraPrueba(){
	string unaPalabra = "PaLaBrA";
	Parser unParser;
	unParser = Parser();
	int *terminosLinea = new int();
	int *terminosDoc = new int();
	Termino otroTermino;

	cout<<"***------TERCERA PRUEBA----------***"<<endl;
	cout<<"Leemos un archivo y lo parseamos termino a termino."<<endl;
	abb::ArbolB<Termino, 40> *lexico = new abb::ArbolB<Termino, 40>;
	FILE* archivoPrueba;
	archivoPrueba = unParser.abrirArchivo("muyDificil.txt");
	*terminosDoc = 0;
	unParser.parsearArchivo(archivoPrueba, terminosLinea, terminosDoc, lexico, 0);//num de archivo: 0
	//lexico->emitir();

	cout<<"CANTIDAD DE TERMINOS:"<<*terminosDoc<<endl;

	return;
}

void cuartaPrueba(char* directorioRuta){

	Parser unParser;
		unParser = Parser();
		abb::ArbolB<Termino, 40> *lexico = new abb::ArbolB<Termino, 40>;
		int *terminosLinea = new int();
		int *terminosDoc = new int();

		Kmeans unKmean = Kmeans(20, 15);
		unKmean.crearCentroides();
		float unCentroide[15];

		unParser.parsearDirectorio(directorioRuta, lexico);
		float *offsetLexico;

		//lexico->emitir(unParser.getCantidadDocumentos());
		//cout<<endl;

		float *unDocumento = new float[lexico->getEntradas()];
		lexico->armarDocumento(0, unDocumento);

		//float *otroDocumento = new float[lexico->getEntradas()];
		//lexico->armarDocumento(0, otroDocumento);

		/*for (int k=0; k<lexico->getEntradas(); k++){
			cout<<unDocumento[k]<<" ";
		}
		cout<<endl;
		cout<<endl;*/

		//for (int p=0; p<lexico->getEntradas(); p++){
			//cout<<otroDocumento[p]<<" ";
		//}
		cout<<endl;
		cout<<endl;

		cout<<"Cantidad de documentos procesados: "<<unParser.getCantidadDocumentos()<<endl;
		cout<<"Cantidad de terminos distintos: "<<lexico->getEntradas()<<endl;

		/*for (int m = 0; m < 20; m++){
			cout<<unKmean.getOffset(m)<<endl;
		}
		cout<<endl;

		int unOffset = unKmean.getOffset(1);
		unKmean.getCentroide(unOffset, unCentroide);

		cout<<"OFFSET: "<<unOffset<<" ";
		for (int n = 0; n<15; n++){
			cout<<unCentroide[n]<<",";
		}
		cout<<"EOF]"<<endl;

		offsetLexico = lexico->guardarVectoresEnDisco(unParser.getCantidadDocumentos(),lexico->getEntradas());

		for (int arch = 0; arch < unParser.getCantidadDocumentos(); arch++){
			cout<<"offset a archivo "<<arch<<": "<<offsetLexico[arch]<<endl;
		}
		cout<<"EOF: "<<offsetLexico[unParser.getCantidadDocumentos()]<<endl;*/

		delete []lexico;
		delete terminosLinea;
		delete terminosDoc;
		delete []unDocumento;

		return;
}

int quintaPrueba(){

	Kmeans unKmean = Kmeans(20, 15);
	unKmean.crearCentroides();
	float unCentroide[15];
	float otroCentroide[15];
	int unOffset;
	float *unRadio = new float;
	float *otroRadio = new float;
	*unRadio = 0.58;
	for (int i = 0; i < 15; i++) otroCentroide[i] = 9.99;

	for (int m = 0; m < 20; m++){
		cout<<unKmean.getOffset(m)<<endl;
	}
	cout<<endl;

	for (int k = 0; k < 20; k++){
		unOffset = unKmean.getOffset(k);
		unKmean.getCentroide(unOffset, unCentroide);

		cout<<"Documento: "<<k<<" ";
		cout<<"OFFSET: "<<unOffset<<" [";
		for (int n = 0; n<15; n++){
			cout<<unCentroide[n]<<",";
		}
		cout<<"EOF]"<<endl;
	}

	unKmean.setCentroide(0, otroCentroide);

	cout<<endl;
	cout<<endl;

	for (int p = 0; p < 20; p++){
		unOffset = unKmean.getOffset(p);
		unKmean.getCentroide(unOffset, unCentroide);

		cout<<"Documento: "<<p<<" ";
		cout<<"OFFSET: "<<unOffset<<" [";
		for (int a = 0; a<15; a++){
			cout<<unCentroide[a]<<",";
		}
		cout<<"EOF]"<<endl;
	}
	unKmean.setCentroide(8, otroCentroide);

	cout<<endl;
	cout<<endl;

	for (int p = 0; p < 20; p++){
		unOffset = unKmean.getOffset(p);
		unKmean.getCentroide(unOffset, unCentroide);

		cout<<"Documento: "<<p<<" ";
		cout<<"OFFSET: "<<unOffset<<" [";
		for (int a = 0; a<15; a++){
			cout<<unCentroide[a]<<",";
		}
		cout<<"EOF]"<<endl;
	}
	for (int i = 0; i < 15; i++) otroCentroide[i] = 0.0;
	unKmean.setCentroide(8, otroCentroide);

	cout<<endl;
	cout<<endl;


	for (int p = 0; p < 20; p++){
		unOffset = unKmean.getOffset(p);
		unKmean.getCentroide(unOffset, unCentroide);

		cout<<"Documento: "<<p<<" ";
		cout<<"OFFSET: "<<unOffset<<" [";
		for (int a = 0; a<15; a++){
			cout<<unCentroide[a]<<",";
		}
		cout<<"EOF]"<<endl;
	}

	cout<<"AHORA CON RADIO: "<<endl;
	for (int i = 0; i < 15; i++) otroCentroide[i] = 555.0;
	unKmean.setCentroideConRadio(8, otroCentroide, unRadio);

	unOffset = unKmean.getOffset(8);
	unKmean.getCentroideConRadio(unOffset, unCentroide, otroRadio);

	cout<<"Documento: "<<8<<" RADIO: "<<*otroRadio;
	cout<<" OFFSET: "<<unOffset<<" [";
	for (int a = 0; a<15; a++){
		cout<<unCentroide[a]<<",";
	}
	cout<<"EOF]"<<endl;

	delete unRadio;
	delete otroRadio;
	return 0;
}



void sextaPrueba(){
	Operador unOperador;
	float *unVector = new float[15];
	float *otroVector = new float[15];
	float *aux = new float[15];

	for (int i = 0; i < 15; i++){
		unVector[i] = 1.0;
	}
	for (int j = 0; j < 15; j++){
		otroVector[j] = 500.0;
	}
	cout<<"Operacion norma 1: "<<unOperador.norma(unVector, 15)<<endl;
	cout<<"Operacion norma 2: "<<unOperador.norma(otroVector, 15)<<endl;
	cout<<"Distancia V1 y V2: "<<unOperador.distanciaCoseno(unVector, otroVector,15)<<endl;

	unOperador.puntoMedio(unVector, otroVector,15, aux);
	cout<<"Punto medio: [";
	for (int k = 0; k < 15; k++) cout<<aux[k]<<", ";
	cout<<"]"<<endl;
}

void septimaPrueba(){

	int cantidad = 35;
	Kmeans unKmean = Kmeans(cantidad, 15);
	float *unCentroide = new float[15];
	float *otroCentroide = new float[15];
	long int unOffset = 0;

	for (int i = 0; i < 15; i++){
		unCentroide[i] = 10.0;
		otroCentroide[i] = 1.0;
	}

	unKmean.crearCentroides(unCentroide, otroCentroide);

	for (int k = 0; k < cantidad; k++){
		unOffset = unKmean.getOffset(k);
		unKmean.getCentroide(unOffset, unCentroide);

		cout<<"Documento: "<<k<<" ";
		cout<<"OFFSET: "<<unOffset<<" [";
		for (int n = 0; n<15; n++){
			cout<<unCentroide[n]<<",";
		}
		cout<<"EOF]"<<endl;
	}

	return;
}

int octavaPrueba(char *unDirectorio){

	Kmeans unKmeans = Kmeans(5);
	unKmeans.parsearDirectorio(unDirectorio);

	int *unDoc = new int;
	int *primerCercano = new int;
	int *segundoCercano = new int;

	//FILE *docsClasificados = fopen("documentosCategorizados.dat", "r");

	//for (int i = 0; i < 16; i++){
	//	fread(unDoc, sizeof(unDoc), 1, docsClasificados);
	//	fread(primerCercano, sizeof(primerCercano), 1, docsClasificados);
	//	fread(segundoCercano, sizeof(segundoCercano), 1, docsClasificados);
		//cout<<"Documento: "<<*unDoc<<" primer cercano: "<<*primerCercano<<" siguiente: "<<*segundoCercano<<endl;
	//}
	unKmeans.emitirResultados();


	//fclose(docsClasificados);
	delete unDoc;
	delete primerCercano;
	delete segundoCercano;
	return 0;
}

void novenaPrueba(){
	Kmeans unKmeans;
	for (int i = 0; i < 16; i++){
		unKmeans.getNombreDocumento(i);
	}
	unKmeans.getNombreDocumento(5);
	unKmeans.getNombreDocumento(9);
	unKmeans.getNombreDocumento(1);

	return;
}

void decimaPrueba(){
	Kmeans unKmeans;
	unKmeans.emitirResultados();
	return;
}

int main(int argc, char *argv[]){

	cout<<endl;
	cout<<endl;
	cout<<"***---------------------------------------------------***"<<endl;
	cout<<"		Comienzo pruebas de Parser"<<endl;
	cout<<"***---------------------------------------------------***"<<endl;
	cout<<endl;
	cout<<endl;


	//cuartaPrueba(argv[1]);
	//quintaPrueba();
	//sextaPrueba();

	//septimaPrueba();

	octavaPrueba(argv[1]);

	//decimaPrueba();

	//novenaPrueba();

	//unDocumento = lexico->armarDocumento(unParser.getCantidadDocumentos(),unDocumento);


	//primeraPrueba();

	//segundaPrueba();

	//terceraPrueba();

	cout<<"***---------------------------------------------------***"<<endl;
	cout<<"		FINAL DE LA PRUEBA PARSER"<<endl;
	cout<<"***---------------------------------------------------***"<<endl;
	cout<<endl;
	cout<<endl;


	return 0;
};

